<?php

class CommentsModel extends Zend_Db_Table_Abstract {

    protected $_name = 'comments';

    /**
     * Добавляет секцию без настроек
     *
     * @param int $sid #ID секции
     */
    public function newSettings($sid) {
        $this->_db->insert(PREFIX . 'comments_settings', array('sid' => $sid));
    }

    /**
     * Получение настроек
     *
     * @param int $sid #ID секции
     */
    public function getSettings($sid) {
        $sql = $this->_db->select()->from(PREFIX . 'comments_settings')->where('sid = ' . $sid);
        $res = $this->_db->fetchRow($sql);
        return $res;
    }

    /**
     * Обновление настроек
     *
     * @param int $sid #ID секции
     * @param array $data Массив настроек
     */
    public function updateSettings($sid,$data) {
        $this->_db->update(PREFIX . 'comments_settings', $data, 'sid = ' . $sid);
    }

    /**
     * Получение комментариев
     *
     * @param int $sid
     * @param int $oid
     * @return mixed
     */
    public function getComments($sid, $oid = 0, $id = 0) {

        $select = $this->_db->select()
                ->from(array('c' => PREFIX . 'comments'))
                ->joinLeft(array('u' => PREFIX . 'users'),'c.uid = u.id',array('login','name'))
                ->where('c.sid = ?', $sid);
        if ($oid > 0)
            $select->where('c.oid = ?', $oid);
        $select->order('c.lft ASC');
        if ($id > 0){
            $select->where('c.id = ?' , $id);
            $res = $this->_db->fetchRow($select);
        } else {
            $res = $this->_db->fetchAll($select);
        }
        return $res;
    }

    /**
     * Получение последних комментариев
     *
     * @param int $sid #ID секции
     * @param int $oid #ID объекта
     * @param int $limit Количественное ограничение
     * @return mixed
     */
    public function getLastComments($sid, $oid = 0, $limit = 1) {
        $select = $this->_db->select()
                ->from(array('c' => PREFIX . 'comments'))
                ->joinLeft(array('u' => PREFIX . 'users'),'c.uid = u.id',array('login','name','email'))
                ->where('c.sid = ?', $sid);
        if ($oid > 0)
            $select->where('c.oid = ?', $oid);
        $select->order('c.lft DESC')->limit($limit);
        if ($limit > 1){
            $res = $this->_db->fetchAll($select);
        } else {
            $res = $this->_db->fetchRow($select);
        }
        return $res;
    }

    /*
    public function getCount($object, $oid) {
        $select = $this->select()->from('comments', 'COUNT(*) as 0');
        $select->where('object = ?', $object)->where('oid = ?', $oid);
        $select->order('lft ASC')->order('time DESC');
        $res = $this->fetchRow($select);
        $col = $res->toArray();
        if (isset($col[0])) {
            return $col[0];
        } else {
            return 0;
        }
    }
*/

    /**
     * Добавление комментария
     *
     * @param array $data
     * @return int #ID
     */
    public function newComment($data) {
        $pid = intval($data['parent']);
        $sid = intval($data['sid']);
        $oid = intval($data['oid']);
        if ($data['parent'] > 0){   //Ответ
            $comment = $this->getComments($sid, $oid, $pid);
            if (is_null($comment)){ //Родительского комментария нет
                return false;
            } else {
                $data['lft'] = $comment->rght;
                $data['rght'] = $comment->rght + 1;
                $data['level'] = $comment->level + 1;
                //Раздвигаем ветку
                $this->update(array('lft' => new Zend_Db_Expr('lft + 2')), 'lft > ' . $comment->rght);
                $this->update(array('rght' => new Zend_Db_Expr('rght + 2')), 'rght >= ' . $comment->rght);
            }
        } else {
            $data['level'] = 0;
            if (!($comment = $this->getLastComments($sid, $oid))){ //Первый комментарий
                $data['lft'] = 1;
                $data['rght'] = 2;
            } else { //Последний комментарий
                $data['lft'] = $comment->rght + 1;
                $data['rght'] = $comment->rght + 2;
            }
        }
        $this->insert($data);
        $id = $this->_db->lastInsertId();
        return $id;
    }



    public function deleteComment($id) {
        $this->delete("id = " . $id);
    }

    /**
     * Удаление секции с содержимым
     *
     * @param int $sid #ID секции
     */
    public function deleteSection($sid) {
        $settings = $this->getSettings($sid);
        $this->delete("sid = " . $settings->section);
    }
}